OpenCV运动目标检测背景差法和帧差法的理解

您所在的位置:网站首页 opencv多目标检测diff frame OpenCV运动目标检测背景差法和帧差法的理解

OpenCV运动目标检测背景差法和帧差法的理解

2024-06-27 17:27| 来源: 网络整理| 查看: 265

视频中运动目标检测的一种思路是,通过区分视频中静止和运动的部分,提取出运动的部分就是我们的检测目标。 

背差法是:如果事先拍好静止的背景,每一帧的图像与背景图像相减可以得到差异的部分,差异的部分就是运动目标。下面举两张图片的例子来体会:

上图使用absdiff图像减法函数,代码如下:

//二值化腐蚀膨胀学习,帧差法和背景差法对比测试 #include #include using namespace cv; using namespace std; int main(int argc, char** argv) { Mat back = imread("D:/feiji.jpg");;//背景 Mat frame = imread("D:/feiji2.jpg");;//当前图片 Mat fore;//前景 imshow("1背景图像", back); imshow("2当前图像", frame); absdiff(frame, back, fore);//absdiff是图像减法。当前图像减去背景图像得到前景图像fore imshow("3前景图像", fore); waitKey(0); return 0; }

帧差法也是使用absdiff图像减法函数,只不过是相邻帧图像相减(下图假设是相邻帧,笑脸从左往右移动到飞机尾部),找出差异的部分。例如下面两个图像的例子:

代码如下(实际上和上面代码是一样的,只是为了突出对比一下):

//二值化腐蚀膨胀学习,帧差法和背景差法对比测试 #include #include using namespace cv; using namespace std; int main(int argc, char** argv) { Mat proframe = imread("D:/feiji2.jpg");;//前一帧图像 Mat frame = imread("D:/feiji3.jpg");;//当前帧图片 Mat fore;//前景 imshow("1前一帧图像", proframe); imshow("2当前帧图像", frame); absdiff(frame, proframe, fore);//absdiff是图像减法。当前图像减去背景图像得到前景图像fore imshow("3前景图像", fore); waitKey(0); return 0; }

之所以先用图片的例子,是因为实际处理视频的时候,也是将视频分成一帧一帧的来处理,每一帧的图像存储在Mat对象中,进行上述操作。

下面来看看帧差法在视频中的表现:(如图是运动的车辆)

检测效果较好,检测出来的差异基本上就是车辆的样子,但是要知道,如果运动目标非常快,就会出现和上面图片实验一样,出现这种情况:    检测的差异部分表现为“两个运动物体”。

代码如下:

///运动物体检测——帧差法、缺点是无法对运动后突然又静止的景象进行识别,优点是光照不影响; #include "opencv2/opencv.hpp" using namespace cv; #include using namespace std; //运动物体检测函数声明 Mat MoveDetect(Mat temp, Mat frame); int main() { VideoCapture video("D://车.mp4");//定义VideoCapture类video if (!video.isOpened()) //对video进行异常检测 { cout frame;//读帧进frame imshow("frame", frame); if (frame.empty())//对帧进行异常检测 { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3